/**
 * Data Model: Insight 元数据管理 Web 控制台
 *
 * 定义前端TypeScript数据模型
 * 所有类型基于后端API响应结构,确保前后端类型一致性
 *
 * Generated: 2025-10-23
 * Source: specs/002-specify-scripts-bash/data-model.md
 */

// ==================== 核心实体类型 ====================

// 1. DataSource (数据源)

/**
 * 数据库类型枚举
 */
export enum DatabaseType {
  MYSQL = 'MYSQL',
  ORACLE = 'ORACLE',
  POSTGRESQL = 'POSTGRESQL',
  SQLSERVER = 'SQLSERVER',
  TIDB = 'TIDB',
  DAMENG = 'DAMENG',
}

/**
 * 数据源状态枚举
 */
/**
 * 数据源状态枚举
 */
export enum DataSourceStatus {
  CONNECTED = 'CONNECTED', // 已连接
  DISCONNECTED = 'DISCONNECTED', // 连接失败
  UNKNOWN = 'UNKNOWN', // 未知状态
  ACTIVE = 'ACTIVE', // 正常
  DELETED = 'DELETED', // 已删除
}

/**
 * 数据源实体
 */
export interface DataSource {
  id: number
  name: string
  description?: string
  dbType: DatabaseType
  host: string
  port: number
  databaseName: string
  username: string
  password?: string // 前端编辑时使用,列表不返回
  enabled: boolean // 启用/禁用状态
  createdAt: string // ISO 8601 格式
  updatedAt: string
}

/**
 * 数据源创建请求
 */
export interface CreateDataSourceRequest {
  name: string
  description?: string
  dbType: DatabaseType
  host: string
  port: number
  databaseName: string
  username: string
  password: string
  enabled?: boolean // 默认true
}

/**
 * 数据源更新请求
 */
export interface UpdateDataSourceRequest {
  name?: string
  description?: string
  password?: string // 可选:更新密码
  enabled?: boolean
}

/**
 * 数据源密码更新请求
 */
export interface UpdateDataSourcePasswordRequest {
  newPassword: string
}

/**
 * 数据源连接测试请求
 */
export interface TestConnectionRequest {
  dbType: DatabaseType
  host: string
  port: number
  databaseName: string
  username: string
  password: string
}

/**
 * 数据源连接测试响应
 */
export interface TestConnectionResponse {
  success: boolean
  message: string
  serverVersion?: string // 数据库版本信息
}

// 2. CollectionTask (采集任务)

/**
 * 采集任务类型枚举
 */
export enum TaskType {
  FULL = 'FULL', // 全量采集
  INCREMENTAL = 'INCREMENTAL', // 增量采集
}

/**
 * 采集任务状态枚举
 */
export enum TaskStatus {
  PENDING = 'PENDING', // 等待执行
  RUNNING = 'RUNNING', // 运行中
  SUCCESS = 'SUCCESS', // 成功
  PARTIAL_SUCCESS = 'PARTIAL_SUCCESS', // 部分成功
  FAILED = 'FAILED', // 失败
  CANCELLED = 'CANCELLED', // 已取消
}

/**
 * 失败表信息
 */
export interface FailedTable {
  schemaName?: string
  tableName: string
  failureReason: string
  retryCount: number
}

/**
 * 采集任务实体
 */
export interface CollectionTask {
  id: number
  datasourceId: number
  datasourceName: string // 冗余字段,便于列表展示
  type: TaskType  // 与后端返回字段保持一致
  status: TaskStatus
  totalTables: number
  completedTables: number
  failedTables?: FailedTable[] // 部分成功时包含失败表清单
  startTime?: string // ISO 8601 格式
  endTime?: string
  createdAt: string
  updatedAt: string
}

/**
 * 创建采集任务请求
 */
export interface CreateCollectionTaskRequest {
  datasourceId: number
  type: TaskType  // 后端期望字段名为type,而非taskType
}

// 3. MetadataTable (元数据表)

/**
 * 表类型枚举
 */
export enum TableType {
  TABLE = 'TABLE',
  VIEW = 'VIEW',
  MATERIALIZED_VIEW = 'MATERIALIZED_VIEW',
}

/**
 * 元数据表实体
 */
export interface MetadataTable {
  id: number
  datasourceId: number
  datasourceName: string // 冗余字段
  datasourceStatus: DataSourceStatus // 数据源状态
  schemaName?: string
  tableName: string
  tableType: TableType
  tableComment?: string
  rowCount?: number
  sizeInBytes?: number
  createdAt: string
  updatedAt: string
}

// 4. MetadataColumn (元数据列)

/**
 * 元数据列实体
 */
export interface MetadataColumn {
  id: number
  tableId: number
  columnName: string
  dataType: string
  columnSize?: number
  decimalDigits?: number
  nullable: boolean
  defaultValue?: string
  columnComment?: string
  ordinalPosition: number // 列序号
  isPrimaryKey: boolean
  isForeignKey: boolean
  createdAt: string
  updatedAt: string
}

// 5. ExportTask (导出任务)

/**
 * 导出格式枚举
 */
export enum ExportFormat {
  EXCEL = 'EXCEL',
  PDF = 'PDF',
  MARKDOWN = 'MARKDOWN',
  HTML = 'HTML',
}

/**
 * 导出任务状态枚举
 */
export enum ExportStatus {
  PENDING = 'PENDING',
  RUNNING = 'RUNNING',
  SUCCESS = 'SUCCESS',
  PARTIAL_SUCCESS = 'PARTIAL_SUCCESS', // 文件生成成功但归档失败
  FAILED = 'FAILED',
}

/**
 * 归档状态枚举
 */
export enum ArchiveStatus {
  NOT_ARCHIVED = 'NOT_ARCHIVED', // 未归档
  ARCHIVING = 'ARCHIVING', // 归档中
  ARCHIVED = 'ARCHIVED', // 归档成功
  ARCHIVE_FAILED = 'ARCHIVE_FAILED', // 归档失败
}

/**
 * 导出任务实体
 */
export interface ExportTask {
  id: number
  datasourceId: number
  datasourceName: string
  format: ExportFormat
  fileName: string
  fileSize: number
  fileSizeFormatted: string
  expiresAt?: string
  isArchived: boolean
  status: ExportStatus
  createdAt: string
  isExpired: boolean
}

/**
 * 创建导出任务请求
 */
export interface CreateExportTaskRequest {
  datasourceId: number
  format: ExportFormat
  autoArchiveToMinio?: boolean // 默认false
  includeIndexes?: boolean // 默认true
  includeRelationships?: boolean // 默认true
}

// ==================== 响应包装类型 ====================

/**
 * API通用响应包装
 */
export interface ApiResponse<T> {
  success: boolean
  message?: string
  data?: T
  error?: ErrorDetail
}

/**
 * 错误详情
 */
export interface ErrorDetail {
  code: string
  message: string
  details?: string
}

/**
 * 分页响应
 */
export interface PageResponse<T> {
  content: T[]
  pageable: {
    pageNumber: number
    pageSize: number
  }
  totalElements: number
  totalPages: number
  last: boolean
  first: boolean
  numberOfElements: number
  size: number
  number: number
  empty: boolean
}

// ==================== 前端专用类型 ====================

/**
 * 渐进式加载状态
 */
export enum LoadingState {
  IDLE = 'IDLE', // 空闲
  LOADING = 'LOADING', // 加载中(<2秒)
  SLOW = 'SLOW', // 慢速加载(2-5秒)
  VERY_SLOW = 'VERY_SLOW', // 极慢加载(5-10秒)
  CANCELLABLE = 'CANCELLABLE', // 可取消(>10秒)
}

/**
 * 渐进式加载状态管理
 */
export interface ProgressiveLoadingState {
  state: LoadingState
  startTime: number
  message: string
  cancellable: boolean
}

/**
 * 表单验证错误
 */
export interface FormFieldError {
  field: string
  message: string
}

// ==================== 常量定义 ====================

/**
 * 加载阈值常量 (毫秒)
 */
export const LOADING_THRESHOLD_BASIC = 2000 // 2秒
export const LOADING_THRESHOLD_DETAILED = 5000 // 5秒
export const LOADING_THRESHOLD_CANCELLABLE = 10000 // 10秒

/**
 * 数据库类型显示名称映射
 */
export const DB_TYPE_NAMES: Record<DatabaseType, string> = {
  [DatabaseType.MYSQL]: 'MySQL',
  [DatabaseType.ORACLE]: 'Oracle',
  [DatabaseType.POSTGRESQL]: 'PostgreSQL',
  [DatabaseType.SQLSERVER]: 'SQL Server',
  [DatabaseType.TIDB]: 'TiDB',
  [DatabaseType.DAMENG]: '达梦数据库',
}

/**
 * 任务状态显示名称映射
 */
export const TASK_STATUS_NAMES: Record<TaskStatus, string> = {
  [TaskStatus.PENDING]: '等待执行',
  [TaskStatus.RUNNING]: '运行中',
  [TaskStatus.SUCCESS]: '成功',
  [TaskStatus.PARTIAL_SUCCESS]: '部分成功',
  [TaskStatus.FAILED]: '失败',
  [TaskStatus.CANCELLED]: '已取消',
}

/**
 * 导出格式显示名称映射
 */
export const EXPORT_FORMAT_NAMES: Record<ExportFormat, string> = {
  [ExportFormat.EXCEL]: 'Excel (xlsx)',
  [ExportFormat.PDF]: 'PDF',
  [ExportFormat.MARKDOWN]: 'Markdown (md)',
  [ExportFormat.HTML]: 'HTML',
}

/**
 * 归档状态显示名称映射
 */
export const ARCHIVE_STATUS_NAMES: Record<ArchiveStatus, string> = {
  [ArchiveStatus.NOT_ARCHIVED]: '未归档',
  [ArchiveStatus.ARCHIVING]: '归档中',
  [ArchiveStatus.ARCHIVED]: '已归档',
  [ArchiveStatus.ARCHIVE_FAILED]: '归档失败',
}

/**
 * 数据库类型默认端口映射
 */
export const DB_TYPE_DEFAULT_PORTS: Record<DatabaseType, number> = {
  [DatabaseType.MYSQL]: 3306,
  [DatabaseType.ORACLE]: 1521,
  [DatabaseType.POSTGRESQL]: 5432,
  [DatabaseType.SQLSERVER]: 1433,
  [DatabaseType.TIDB]: 4000,
  [DatabaseType.DAMENG]: 5236,
}
// 类型别名 - 为了向后兼容
export type DataSourceCreateRequest = CreateDataSourceRequest
export type DataSourceUpdateRequest = UpdateDataSourceRequest  
export type DataSourceTestRequest = TestConnectionRequest
export type DataSourceTestResponse = TestConnectionResponse

// 数据源列表查询参数
export interface DataSourceListParams {
  page?: number
  size?: number
  keyword?: string
  dbType?: DatabaseType
  enabled?: boolean
}

// CollectionTask 类型别名
export type CollectionTaskCreateRequest = CreateCollectionTaskRequest

// ExportTask 类型别名  
export type ExportTaskCreateRequest = CreateExportTaskRequest
